'use strict';

var utils = require('./../utils');

// isURLSameOrigin：判断URL是否是当前浏览器的url的同一个来源。
module.exports = utils.isStandardBrowserEnv()
  ? // 标准浏览器环境完全支持测试请求URL是否与当前位置来源相同所需的API。
    (function standardBrowserEnv() {
      // 判断navigator.userAgent是否是`msie`或者`trident`类型的，从而判断浏览器是不是ie浏览器
      var msie = /(msie|trident)/i.test(navigator.userAgent);
      // 创建一个用于解析url的a节点
      var urlParsingNode = document.createElement('a');
      // url的源
      var originURL;

      /**
       * 解析一个URL以发现它的组成部分
       *
       * @param {String} url 要被解析的URL
       * @returns {Object}
       */
      function resolveURL(url) {
        var href = url;

        if (msie) {
          // IE需要属性设置两次来规范属性
          urlParsingNode.setAttribute('href', href);
          href = urlParsingNode.href;
        }

        urlParsingNode.setAttribute('href', href);

        // urlParsingNode提供了UrlUtils接口 - http://url.spec.whatwg.org/#urlutils
        return {
          href: urlParsingNode.href,
          protocol: urlParsingNode.protocol
            ? urlParsingNode.protocol.replace(/:$/, '')
            : '',
          host: urlParsingNode.host,
          search: urlParsingNode.search
            ? urlParsingNode.search.replace(/^\?/, '')
            : '',
          hash: urlParsingNode.hash
            ? urlParsingNode.hash.replace(/^#/, '')
            : '',
          hostname: urlParsingNode.hostname,
          port: urlParsingNode.port,
          pathname:
            urlParsingNode.pathname.charAt(0) === '/'
              ? urlParsingNode.pathname
              : '/' + urlParsingNode.pathname,
        };
      }

      // 获取当前浏览器的URL
      originURL = resolveURL(window.location.href);

      /**
       * 确定一个URL是否与当前位置共享同一来源
       *
       * @param {String} requestURL 要判断的URL
       * @returns {boolean} 如果URL共享同一来源，则为 true，否则为 false。
       */
      return function isURLSameOrigin(requestURL) {
        var parsed = utils.isString(requestURL)
          ? // 如果是字符串，创建一个a链接解析信息
            resolveURL(requestURL)
          : // 否则直接从对象中获取信息
            requestURL;
        return (
          parsed.protocol === originURL.protocol &&
          parsed.host === originURL.host
        );
      };
    })()
  : // 非标准的浏览器环境（web workers, react-native）缺乏必要的支持。
    (function nonStandardBrowserEnv() {
      return function isURLSameOrigin() {
        return true;
      };
    })();
